<?php
class ControllerCommonFileManager extends Controller
{
	private $error = array();

	public function index()
	{
		$this->load->language('common/filemanager');
		$this->data['title'] = $this->language->get('heading_title');

		if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1')))
		{
			$this->data['base'] = 'https://' . DOMAIN_NAME . '/';
		}
		else
		{
			$this->data['base'] = 'http://' . DOMAIN_NAME . '/';
		}

		$this->data['entry_folder']   = $this->language->get('entry_folder');
		$this->data['entry_move']     = $this->language->get('entry_move');
		$this->data['entry_copy']     = $this->language->get('entry_copy');
		$this->data['entry_rename']   = $this->language->get('entry_rename');
		$this->data['button_folder']  = $this->language->get('button_folder');
		$this->data['button_delete']  = $this->language->get('button_delete');
		$this->data['button_move']    = $this->language->get('button_move');
		$this->data['button_copy']    = $this->language->get('button_copy');
		$this->data['button_rename']  = $this->language->get('button_rename');
		$this->data['button_upload']  = $this->language->get('button_upload');
		$this->data['button_refresh'] = $this->language->get('button_refresh');
		$this->data['button_submit']  = $this->language->get('button_submit');

		$this->data['wmark_title']       = $this->language->get('wmark_title');
		$this->data['wmark_none']        = $this->language->get('wmark_none');
		$this->data['wmark_center']      = $this->language->get('wmark_center');
		$this->data['wmark_topleft']     = $this->language->get('wmark_topleft');
		$this->data['wmark_topright']    = $this->language->get('wmark_topright');
		$this->data['wmark_bottomleft']  = $this->language->get('wmark_bottomleft');
		$this->data['wmark_bottomright'] = $this->language->get('wmark_bottomright');

		$this->data['error_select']    = $this->language->get('error_select');
		$this->data['error_directory'] = $this->language->get('error_directory');
		$this->data['directory']       = $this->registry->cdn_img_url('data/', IMAGES_PATH);
		$this->load->model('tool/image');
		$this->data['no_image'] = $this->model_tool_image->resize('no_image.jpg', 100, 100);

		if (isset($this->request->get['field']))
		{
			$this->data['field'] = $this->request->get['field'];
		}
		else
		{
			$this->data['field'] = '';
		}

		if (isset($this->request->get['CKEditorFuncNum']))
		{
			$this->data['fckeditor'] = $this->request->get['CKEditorFuncNum'];
		}
		else
		{
			$this->data['fckeditor'] = false;
		}

		$this->template = 'template/filemanager.tpl';
		$this->response->setOutput($this->render());
	}

	public function image()
	{
		$this->load->model('tool/image');

		if (isset($this->request->get['image']))
		{
			$this->response->setOutput($this->model_tool_image->resize(html_entity_decode($this->request->get['image'], ENT_QUOTES, 'UTF-8'), 100, 100));
		}
	}

	public function directory()
	{
		$json = array();
		if (isset($this->request->post['directory']))
		{
			$directories = glob(rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/') . '/*', GLOB_ONLYDIR);

			if ($directories)
			{
				$i = 0;

				foreach ($directories as $directory)
				{
					$json[$i]['data']                    = basename($directory);
					$json[$i]['attributes']['directory'] = mb_substr($directory, strlen(DIR_IMAGE . 'data/'));

					$children = glob(rtrim($directory, '/') . '/*', GLOB_ONLYDIR);

					if ($children)
					{
						$json[$i]['children'] = ' ';
					}

					$i++;
				}
			}
		}

		$this->response->setOutput(json_encode($json));
	}

	public function files()
	{
		$json = array();

		if (!empty($this->request->post['directory']))
		{
			$directory = DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']);
		}
		else
		{
			$directory = DIR_IMAGE . 'data/';
		}

		$allowed = array(
			'.jpg',
			'.jpeg',
			'.png',
			'.gif'
		);
		$files   = glob(rtrim($directory, '/') . '/*');

		if ($files)
		{
			foreach ($files as $file)
			{
				if (is_file($file))
				{
					$ext = strrchr($file, '.');
				}
				else
				{
					$ext = '';
				}

				if (in_array(strtolower($ext), $allowed))
				{
					$size = filesize($file);

					$i = 0;

					$suffix = array(
						'B',
						'KB',
						'MB',
						'GB',
						'TB',
						'PB',
						'EB',
						'ZB',
						'YB'
					);

					while (($size / 1024) > 1)
					{
						$size = $size / 1024;
						$i++;
					}

					$json[] = array(
						'filename' => basename($file),
						'file'     => mb_substr($file, mb_strlen(DIR_IMAGE . 'data/')),
						'size'     => round(mb_substr($size, 0, mb_strpos($size, '.') + 4), 2) . $suffix[$i]
					);
				}
			}
		}

		$this->response->setOutput(json_encode($json));
	}

	public function create()
	{
		$this->load->language('common/filemanager');
		$json = array();

		if (isset($this->request->post['directory']))
		{
			if (isset($this->request->post['name']) || $this->request->post['name'])
			{
				$directory = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/');

				if (!is_dir($directory))
				{
					$json['error'] = $this->language->get('error_directory');
				}

				if (file_exists($directory . '/' . str_replace('../', '', $this->request->post['name'])))
				{
					$json['error'] = $this->language->get('error_exists');
				}
			}
			else
			{
				$json['error'] = $this->language->get('error_name');
			}
		}
		else
		{
			$json['error'] = $this->language->get('error_directory');
		}

		if (!$this->user->hasPermission('modify', 'common/filemanager'))
		{
			$json['error'] = $this->language->get('error_permission');
		}

		if (!isset($json['error']))
		{
			mkdir($directory . '/' . str_replace('../', '', $this->request->post['name']), 0777);
			$json['success'] = $this->language->get('text_create');
		}

		$this->response->setOutput(json_encode($json));
	}

	public function delete()
	{
		$this->load->language('common/filemanager');
		$json = array();

		if (isset($this->request->post['path']))
		{
			$path = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', html_entity_decode($this->request->post['path'], ENT_QUOTES, 'UTF-8')), '/');

			if (!file_exists($path))
			{
				$json['error'] = $this->language->get('error_select');
			}

			if ($path == rtrim(DIR_IMAGE . 'data/', '/'))
			{
				$json['error'] = $this->language->get('error_delete');
			}
		}
		else
		{
			$json['error'] = $this->language->get('error_select');
		}

		if (!$this->user->hasPermission('modify', 'common/filemanager'))
		{
			$json['error'] = $this->language->get('error_permission');
		}

		if (!isset($json['error']))
		{
			if (is_file($path))
			{
				unlink($path);
			}
			elseif (is_dir($path))
			{
				$this->recursiveDelete($path);
			}

			$json['success'] = $this->language->get('text_delete');
		}

		$this->response->setOutput(json_encode($json));
	}

	protected function recursiveDelete($directory)
	{
		if (is_dir($directory))
		{
			$handle = opendir($directory);
		}

		if (!$handle)
		{
			return false;
		}

		while (false !== ($file = readdir($handle)))
		{
			if ($file != '.' && $file != '..')
			{
				if (!is_dir($directory . '/' . $file))
				{
					unlink($directory . '/' . $file);
				}
				else
				{
					$this->recursiveDelete($directory . '/' . $file);
				}
			}
		}

		closedir($handle);

		rmdir($directory);

		return true;
	}

	public function move()
	{
		$this->load->language('common/filemanager');
		$json = array();

		if (isset($this->request->post['from']) && isset($this->request->post['to']))
		{
			$from = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', html_entity_decode($this->request->post['from'], ENT_QUOTES, 'UTF-8')), '/');

			if (!file_exists($from))
			{
				$json['error'] = $this->language->get('error_missing');
			}

			if ($from == DIR_IMAGE . 'data')
			{
				$json['error'] = $this->language->get('error_default');
			}

			$to = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', html_entity_decode($this->request->post['to'], ENT_QUOTES, 'UTF-8')), '/');

			if (!file_exists($to))
			{
				$json['error'] = $this->language->get('error_move');
			}

			if (file_exists($to . '/' . basename($from)))
			{
				$json['error'] = $this->language->get('error_exists');
			}
		}
		else
		{
			$json['error'] = $this->language->get('error_directory');
		}

		if (!$this->user->hasPermission('modify', 'common/filemanager'))
		{
			$json['error'] = $this->language->get('error_permission');
		}

		if (!isset($json['error']))
		{
			rename($from, $to . '/' . basename($from));
			$json['success'] = $this->language->get('text_move');
		}

		$this->response->setOutput(json_encode($json));
	}

	public function copy()
	{
		$this->load->language('common/filemanager');
		$json = array();

		if (isset($this->request->post['path']) && isset($this->request->post['name']))
		{
			if ((mb_strlen($this->request->post['name']) < 3) || (mb_strlen($this->request->post['name']) > 255))
			{
				$json['error'] = $this->language->get('error_filename');
			}

			$old_name = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', html_entity_decode($this->request->post['path'], ENT_QUOTES, 'UTF-8')), '/');

			if (!file_exists($old_name) || $old_name == DIR_IMAGE . 'data')
			{
				$json['error'] = $this->language->get('error_copy');
			}

			if (is_file($old_name))
			{
				$ext = strrchr($old_name, '.');
			}
			else
			{
				$ext = '';
			}

			$new_name = dirname($old_name) . '/' . str_replace('../', '', html_entity_decode($this->request->post['name'], ENT_QUOTES, 'UTF-8') . $ext);

			if (file_exists($new_name))
			{
				$json['error'] = $this->language->get('error_exists');
			}
		}
		else
		{
			$json['error'] = $this->language->get('error_select');
		}

		if (!$this->user->hasPermission('modify', 'common/filemanager'))
		{
			$json['error'] = $this->language->get('error_permission');
		}

		if (!isset($json['error']))
		{
			if (is_file($old_name))
			{
				copy($old_name, $new_name);
			}
			else
			{
				$this->recursiveCopy($old_name, $new_name);
			}

			$json['success'] = $this->language->get('text_copy');
		}

		$this->response->setOutput(json_encode($json));
	}

	function recursiveCopy($source, $destination)
	{
		$directory = opendir($source);

		@mkdir($destination);

		while (false !== ($file = readdir($directory)))
		{
			if (($file != '.') && ($file != '..'))
			{
				if (is_dir($source . '/' . $file))
				{
					$this->recursiveCopy($source . '/' . $file, $destination . '/' . $file);
				}
				else
				{
					copy($source . '/' . $file, $destination . '/' . $file);
				}
			}
		}

		closedir($directory);
	}

	public function folders()
	{
		$this->response->setOutput($this->recursiveFolders(DIR_IMAGE . 'data/'));
	}

	protected function recursiveFolders($directory)
	{
		$output = '';
		$output .= '<option value="' . mb_substr($directory, strlen(DIR_IMAGE . 'data/')) . '">' . mb_substr($directory, strlen(DIR_IMAGE . 'data/')) . '</option>';
		$directories = glob(rtrim(str_replace('../', '', $directory), '/') . '/*', GLOB_ONLYDIR);

		foreach ($directories as $directory)
		{
			$output .= $this->recursiveFolders($directory);
		}

		return $output;
	}

	public function rename()
	{
		$this->load->language('common/filemanager');
		$json = array();

		if (isset($this->request->post['path']) && isset($this->request->post['name']))
		{
			if ((mb_strlen($this->request->post['name']) < 2) || (mb_strlen($this->request->post['name']) > 255))
			{
				$json['error'] = $this->language->get('error_filename');
			}

			$old_name = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', html_entity_decode($this->request->post['path'], ENT_QUOTES, 'UTF-8')), '/');

			if (!file_exists($old_name) || $old_name == DIR_IMAGE . 'data')
			{
				$json['error'] = $this->language->get('error_rename');
			}

			if (is_file($old_name))
			{
				$ext = strrchr($old_name, '.');
			}
			else
			{
				$ext = '';
			}

			$new_name = dirname($old_name) . '/' . str_replace('../', '', html_entity_decode($this->request->post['name'], ENT_QUOTES, 'UTF-8') . $ext);

			if (file_exists($new_name))
			{
				$json['error'] = $this->language->get('error_exists');
			}
		}

		if (!$this->user->hasPermission('modify', 'common/filemanager'))
		{
			$json['error'] = $this->language->get('error_permission');
		}

		if (!isset($json['error']))
		{
			rename($old_name, $new_name);
			$json['success'] = $this->language->get('text_rename');
		}

		$this->response->setOutput(json_encode($json));
	}

	public function upload()
	{
		$this->load->language('common/filemanager');
		$json = array();

		if (isset($this->request->post['directory']))
		{
			if (isset($this->request->files['image']) && $this->request->files['image']['tmp_name'])
			{
				$filename = basename(html_entity_decode($this->request->files['image']['name'], ENT_QUOTES, 'UTF-8'));

				if ((strlen($filename) < 3) || (strlen($filename) > 255))
				{
					$json['error'] = $this->language->get('error_filename');
				}

				$directory = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/');

				if (!is_dir($directory))
				{
					$json['error'] = $this->language->get('error_directory');
				}

				if ($this->request->files['image']['size'] > 500000)
				{
					$json['error'] = $this->language->get('error_file_size');
				}

				$allowed = array(
					'image/jpeg',
					'image/pjpeg',
					'image/png',
					'image/x-png',
					'image/gif',
					'application/x-shockwave-flash'
				);

				if (!in_array($this->request->files['image']['type'], $allowed))
				{
					$json['error'] = $this->language->get('error_file_type');
				}

				$allowed = array(
					'.jpg',
					'.jpeg',
					'.gif',
					'.png',
					'.flv'
				);

				if (!in_array(strtolower(strrchr($filename, '.')), $allowed))
				{
					$json['error'] = $this->language->get('error_file_type');
				}

				if ($this->request->files['image']['error'] != UPLOAD_ERR_OK)
				{
					$json['error'] = 'error_upload_' . $this->request->files['image']['error'];
				}
			}
			else
			{
				$json['error'] = $this->language->get('error_file');
			}
		}
		else
		{
			$json['error'] = $this->language->get('error_directory');
		}

		if (!$this->user->hasPermission('modify', 'common/filemanager'))
		{
			$json['error'] = $this->language->get('error_permission');
		}

		if (!isset($json['error']))
		{
			if (@move_uploaded_file($this->request->files['image']['tmp_name'], $directory . '/' . $filename))
			{
				/**
				 * 判断是否需要加水印
				 */
				$watermark = isset($this->request->post['watermark']) ? $this->request->post['watermark'] : '';
				if (!empty($watermark))
				{
					$this->load->model('tool/image');
					$image = new Image($directory . '/' . $filename);
					$image->watermark(DIR_IMAGE . 'watermark.png', $watermark);
					$image->save($directory . '/' . $filename);
				}

				$json['success'] = $this->language->get('text_uploaded');
			}
			else
			{
				$json['error'] = $this->language->get('error_uploaded');
			}
		}

		$this->response->setOutput(json_encode($json));
	}
}

?>